﻿#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
//给你两棵二叉树 root 和 subRoot 。
//检验 root 中是否包含和 subRoot 具有相同结构和节点值的子树。
//如果存在，返回 true ；否则，返回 false 。
//
//二叉树 tree 的一棵子树包括 tree 的某个节点和这个节点的所有后代节点。
//tree 也可以看做它自身的一棵子树。
//
//示例 1：
//输入：root = [3, 4, 5, 1, 2], subRoot = [4, 1, 2]
//输出：true


  struct TreeNode {
      int val;
      struct TreeNode *left;
      struct TreeNode *right;
  };
 
bool isSameTree(struct TreeNode* p, struct TreeNode* q) {
    if (p == NULL && q == NULL)
    {
        return true;
    }
    if (p == NULL || q == NULL)  //如果都为空，就走上面的，所以只能一个空
    {
        return false;
    }
    if (p->val != q->val)
    {
        return false;
    }

    return isSameTree(p->left, q->left) && isSameTree(p->right, q->right);
}

bool isSubtree(struct TreeNode* root, struct TreeNode* subRoot) {
    if (root == NULL)
    {
        return false;
    }
    if (isSameTree(root, subRoot))
    {
        return true;
    }

    return isSubtree(root->left, subRoot) ||
        isSubtree(root->right, subRoot);
}

//给定一个二叉树，判断它是否是高度平衡的二叉树。
//
//本题中，一棵高度平衡二叉树定义为：
//
//一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 。
//示例 1：
//输入：root = [3, 9, 20, null, null, 15, 7]
//输出：true


  struct TreeNode {
      int val;
      struct TreeNode *left;
      struct TreeNode *right;
  };
 

int Treeheight(struct TreeNode* root) {
    if (root == NULL)
    {
        return 0;
    }
    int left = Treeheight(root->left);
    int right = Treeheight(root->right);
    return left > right ? left + 1 : right + 1;

}


bool isBalanced(struct TreeNode* root) {
    if (root == NULL)
    {
        return true;
    }
    else
    {
        return fabs(Treeheight(root->left) - Treeheight(root->right)) <= 1 && isBalanced(root->left) && isBalanced(root->right);
    }
}
